#include <time.h>
#include "defs.h"
-#include "avltree.h"
#define MYNAME "mmo"
static gpsdata_type mmo_datatype;
static route_head* mmo_rte;
-static avltree_t* category_names, *objects, *mmobjects, *category_ids;
-static avltree_t* icons;
+static QHash<QString, int> category_names;
+static QHash<int, QString> icons;
+static QHash<int, mmo_data_t *> objects;
+static QHash<QString, unsigned> mmobjects;
typedef struct mmo_icon_mapping_s {
const int value;
static mmo_data_t*
mmo_register_object(const int objid, const void* ptr, const gpsdata_type type)
{
- char key[16];
mmo_data_t* data;
data = (mmo_data_t*) xcalloc(1, sizeof(*data));
data->type = type;
data->objid = objid;
- snprintf(key, sizeof(key), "%d", objid);
- avltree_insert(objects, key, data);
+ objects.insert(objid, data);
return data;
}
static int
mmo_get_objid(const void* ptr)
{
- const char* key;
- mmo_data_t* data;
-
- if ((key = avltree_first(objects, (const void**)&data))) do {
- if (data->data == ptr) {
- return atoi(key);
- }
- } while ((key = avltree_next(objects, key, (const void**)&data)));
-
- return 0;
+ foreach(int key, objects.keys()) {
+ if (objects.value(key)->data == ptr) {
+ return key;
+ }
+ }
}
static mmo_data_t*
mmo_get_object(const uint16_t objid)
{
- char key[16];
+ int key;
mmo_data_t* data;
- snprintf(key, sizeof(key), "%d", objid | 0x8000);
- if (! avltree_find(objects, key, (const void**)&data)) {
+ key = objid | 0x8000;
+ if (!objects.contains(key)) {
#ifdef MMO_DBG
gbfseek(fin, -2, SEEK_CUR);
int ni, n;
fatal(MYNAME ": Unregistered object id 0x%04X!\n", objid | 0x8000);
}
- return data;
+ return objects.value(key);
}
static waypoint*
}
static void
-mmo_release_avltree(avltree_t* tree, const int is_object)
+mmo_free_object(mmo_data_t *data)
{
- const char* key;
- char* name;
-
- if ((key = avltree_first(tree, (const void**)&name))) {
- do {
- if (name == NULL) {
- continue;
- }
- if (is_object) {
- mmo_data_t* data = (mmo_data_t*)name;
- if (data->name) {
- xfree(data->name);
- }
- if ((data->type == wptdata) && (data->refct == 0)) {
- waypt_free((waypoint*)data->data);
- }
- }
- xfree(name);
- } while ((key = avltree_next(tree, key, (const void**)&name)));
+ if (data->name) {
+ xfree(data->name);
}
- avltree_done(tree);
+ if ((data->type == wptdata) && (data->refct == 0)) {
+ waypt_free((waypoint*)data->data);
+ }
+ xfree(data);
}
static void
mmo_register_icon(const int id, const char* name)
{
- char key[16];
-
- snprintf(key, sizeof(key), "%d", id);
- avltree_insert(icons, key, xstrdup(name));
+ icons.insert(id, QString::fromUtf8(name));
}
mmo_fillbuf(buf, 12, 1);
i = le_read32(&buf[8]); /* icon */
if (i != -1) {
- char key[16];
- char* name;
-
- snprintf(key, sizeof(key), "%d", i);
- if (avltree_find(icons, key, (const void**)&name)) {
- wpt->icon_descr = name;
- DBG((sobj, "icon = \"%s\"\n", wpt->icon_descr.toUtf8().data()));
+ if (icons.contains(i)) {
+ wpt->icon_descr = icons.value(i);
+ DBG((sobj, "icon = \"%s\"\n", CSTR(wpt->icon_descr)));
}
#ifdef MMO_DBG
else {
fin = gbfopen_le(fname, "rb", MYNAME);
- category_ids = avltree_init(0, MYNAME);
- objects = avltree_init(0, MYNAME);
- icons = avltree_init(0, MYNAME);
-
ico_object_id = pos_object_id = txt_object_id = cat_object_id = 0;
wpt_object_id = rte_object_id = trk_object_id = 0;
{
route_disp_session(curr_session(), NULL, NULL, mmo_finalize_rtept_cb);
- mmo_release_avltree(icons, 0);
- mmo_release_avltree(category_ids, 0);
- mmo_release_avltree(objects, 1);
+ icons.clear();
+
+ foreach (int k, objects.keys()) {
+ mmo_free_object(objects.value(k));
+ }
+ objects.clear();
+
gbfclose(fin);
}
/**************************************************************************/
static void
-mmo_register_category_names(const char* name)
+mmo_register_category_names(const QString& name)
{
- char key[16];
-
- snprintf(key, sizeof(key), "%d", mmo_object_id);
- avltree_insert(category_names, name, xstrdup(key));
+ category_names.insert(name, mmo_object_id);
}
static int
mmo_write_obj_mark(const char* sobj, const char* name)
{
- char* key;
+ QString key = QString::fromUtf8(sobj);
uint16_t nr;
char buf[16];
int res;
- if (avltree_find(mmobjects, sobj, (const void**)&key)) {
- nr = (unsigned)atoi(key);
+ if (mmobjects.contains(key)) {
+ nr = mmobjects.value(key);
gbfputuint16(nr, fout);
} else {
mmo_object_id++;
- snprintf(buf, sizeof(buf), "%u", mmo_object_id);
DBG(("write", "object \"%s\", registered type \"%s\" (id = 0x%04X)\n",
name, sobj, mmo_object_id));
- avltree_insert(mmobjects, sobj, xstrdup(buf));
+ mmobjects.insert(key, mmo_object_id);
gbfputuint32(mmo_filemark, fout);
gbfputuint16(strlen(sobj), fout);
static void
mmo_write_category(const char* sobj, const char* name)
{
- char* key;
uint16_t nr;
+ QString key = QString::fromUtf8(name);
- if (avltree_find(category_names, name, (const void**)&key)) {
- nr = (unsigned)atoi(key);
+ if (category_names.contains(key)) {
+ nr = category_names.value(key);
gbfputuint16(nr & 0x7FFF, fout);
} else {
mmo_write_obj_mark(sobj, name);
- mmo_register_category_names(name);
+ mmo_register_category_names(key);
}
}
{
fout = gbfopen_le(fname, "wb", MYNAME);
- objects = avltree_init(0, MYNAME);
- mmobjects = avltree_init(0, MYNAME);
- category_names = avltree_init(0, MYNAME);
-
mmo_object_id = 0x8000;
mmo_obj_ct = 1; /* ObjIcons always present */
mmo_version = 0x12; /* by default we write as version 0x12 */
static void
mmo_wr_deinit(void)
{
- mmo_release_avltree(mmobjects, 0);
- mmo_release_avltree(category_names, 0);
- mmo_release_avltree(objects, 1);
+ mmobjects.clear();
+ category_names.clear();
+
+ foreach (int k, objects.keys()) {
+ mmo_free_object(objects.value(k));
+ }
+ objects.clear();
gbfclose(fout);
}